package com.hemaapp.hm_FrameWork.result;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.hemaapp.hm_FrameWork.HemaObject;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;


/**
 * @param <T>
 * @author huhu
 */
public class HemaBaseResult<T extends HemaObject> extends HemaObject {
    private boolean success;// 服务器处理状态
    private String msg;// 服务器返回的描述信息
    private int error_code;// 当status==0时，会有一个对应的error_code。详见错误编码表

    private ArrayList<T> objects = new ArrayList<T>();   //实体类
    private int totalCount;

    private Class<T> clazz;

    /**
     * 实例化一个基本的服务器返回结果
     *
     * @param jsonObject -个JSONObject实例
     * @param clazz      实例对应的类型
     */
    public HemaBaseResult(JSONObject jsonObject, final Class<T> clazz) {
        this.clazz = clazz;
        if (jsonObject != null) {
            try {
                if (!jsonObject.isNull("success")) {
                    success = jsonObject.getBoolean("success");
                }
                msg = get(jsonObject, "msg");
                if (!jsonObject.isNull("error_code")) {
                    error_code = jsonObject.getInt("error_code");
                }

                if (!jsonObject.isNull("infor")
                        && !isNull(jsonObject.getString("infor"))) {
                    Object tempInfo = jsonObject.get("infor");
                    if (tempInfo instanceof JSONArray) {
                        JSONArray jsonList = jsonObject.getJSONArray("infor");
                        for (int i = 0; i < jsonList.length(); i++) {
                            T newClass = JSON.parseObject(jsonList.getJSONObject(i).toString(),clazz);
                            objects.add(newClass);
                        }
                        //objects = (ArrayList<T>) JSON.parseObject(jsonList.toString(),new TypeReference<ArrayList<T>>(){});
                    } else {
                        JSONObject object = jsonObject.getJSONObject("infor");
                        if (!object.isNull("totalCount")) {
                            totalCount = object.getInt("totalCount");
                        }
                        if (!object.isNull("listItems")
                                && !isNull(object.getString("listItems"))) {
                            JSONArray jsonList = object.getJSONArray("listItems");
                            for (int i = 0; i < jsonList.length(); i++) {
                                T newClass = JSON.parseObject(jsonList.getJSONObject(i).toString(),clazz);
                                objects.add(newClass);
                            }
                           /* JSONArray jsonList = object.getJSONArray("listItems");
                            objects = (ArrayList<T>) JSON.parseObject(jsonList.toString(), new TypeReference<List<T>>() {
                            });*/
                        }
                    }
                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @return 服务器执行状态
     */
    public boolean isSuccess() {
        return success;
    }

    /**
     * @return 服务器返回的描述信息
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 获取error_code值
     *
     * @return 一个整数(当status==0时，会有一个对应的error_code。详见错误编码表)
     */
    public int getError_code() {
        return error_code;
    }

    /**
     * 返回所有结果列表 部分接口有此内容
     *
     * @return
     */
    public ArrayList<T> getObjects() {
        return objects;
    }

    /**
     * 返回数据条数   部分接口有此内容
     *
     * @return
     */
    public int getTotalCount() {
        return totalCount;
    }
}